/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.bo;

import java.math.BigDecimal;

import model.entidade.Empregado;

import org.junit.After;
import org.junit.Before;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * @author Wanessa, Arthur, Rúben
 */

public class EmprestimoBOTestLimiteSalario {

	public EmprestimoBOTestLimiteSalario() {
	}
        
        @BeforeClass
        public static void setUpClass() throws Exception {
        }

        @AfterClass
        public static void tearDownClass() throws Exception {
        }

        @Before
        public void setUp() {
        }

        @After
        public void tearDown() {
        }
        
	private static int cpfIncrementador = 100;
	

	private String criaCenarioParaEmpregadoJaIncluido(String sexo, String dataNascimento, BigDecimal salario) 
			throws Exception {

		cpfIncrementador++;

		String cpf = String.valueOf(cpfIncrementador);

		EmpregadoBO empregadoBO = EmpregadoBO.getInstance();

		Empregado empregado = new Empregado();	
		empregado.setCpf(cpf); 
		empregado.setSexoPorExtenso(sexo);
		empregado.setDataNascimento(dataNascimento);
		empregado.setSalario(salario);    	

		empregadoBO.incluir(empregado);

		return cpf;
	}

	@Test(expected = EmprestimoException.class) 
	public void testLimiteSalarioInvalido() throws Exception
	{
		
		//ARRANGE
		
		String cpf = criaCenarioParaEmpregadoJaIncluido("Masculino", "22/04/1945",BigDecimal.valueOf(4500));
		
		//ACT
		
		Boolean limiteValido = EmprestimoBO.getInstance().verificaLimiteSalario(BigDecimal.valueOf(4500),cpf);
		
		//ASSERT
		assertTrue(limiteValido);
		
	}

	@Test
	public void testLimiteSalarioValido() throws Exception{

		//ARRANGE
		
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "22/04/1980",BigDecimal.valueOf(4500));
		
		//ACT
		
		Boolean limiteValido = EmprestimoBO.getInstance().verificaLimiteSalario(BigDecimal.valueOf(2000),cpf);
		
		//ASSERT
		assertTrue(limiteValido);
		
		
	}

	@Test
	public void testCalculoValorLimiteSalarioValido() 
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		BigDecimal salario = BigDecimal.valueOf(1000);

		double percentualSalario = 0.70;

		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "09/05/1990", salario );

		BigDecimal valorLimite= salario.multiply(BigDecimal.valueOf(percentualSalario));

		//ACT

		BigDecimal valorLimiteReal=emprestimo.calculaValorLimiteEmprestimoPeloSalario(cpf);

		//ASSERT

		assertEquals(valorLimite, valorLimiteReal);

	}

	@Test
	public void testCalculoValorLimiteSalarioInvalido() 
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		BigDecimal salario = BigDecimal.valueOf(1000);

		double percentualSalario = 0;

		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "09/05/1991", salario );

		BigDecimal valorLimite= salario.multiply(BigDecimal.valueOf(percentualSalario));

		//ACT

		BigDecimal valorLimiteReal=emprestimo.calculaValorLimiteEmprestimoPeloSalario(cpf);

		//ASSERT

		assertEquals(valorLimite, valorLimiteReal);

	}

	@Test
	public void testLimiteSalarioPctValidoParaHomemEntreVinteEUmETrintaECincoAnosComSalarioAcimaDeCincoMil() 
			throws EmprestimoException,Exception
			{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		String cpf;
		String sexo = "Masculino";
		String dataNascimento = "21/12/1988";
		BigDecimal salario = new BigDecimal(5500);

		cpf= criaCenarioParaEmpregadoJaIncluido(sexo,dataNascimento,salario);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.75, pct,0.0);


			}

	@Test 
	public void testLimiteSalarioPctValidoParaHomemEntreVinteEUmETrintaECincoAnosComSalarioMenorACincoMil()
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimoBO= EmprestimoBO.getInstance();

		//Cenario: Homem - 31 anos ...

		String cpf  =criaCenarioParaEmpregadoJaIncluido( "Masculino", "10/07/1980", BigDecimal.valueOf(4500.50));

		//ACT

		double pct = emprestimoBO.calculaPctLimiteEmprestimoSobreSalario(cpf);    	

		//ASSERT

		assertEquals(0.7,pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaHomemEntreVinteEUmETrintaECincoAnosComSalarioIgualACincoMil()
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimoBO= EmprestimoBO.getInstance();

		//Cenario: Homem - 31 anos ...

		String cpf =criaCenarioParaEmpregadoJaIncluido("Masculino", "10/07/1980", BigDecimal.valueOf(5000));

		//ACT

		double pct = emprestimoBO.calculaPctLimiteEmprestimoSobreSalario(cpf);    	

		//ASSERT

		assertEquals(0.7,pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaHomemEntreTrintaESeisEQuarentaECincoAnosComSalarioAcimaDeSeisMil()
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		//Homem de 36 anos
		String cpf =criaCenarioParaEmpregadoJaIncluido("Masculino", "26/05/1975", BigDecimal.valueOf(6510.50));

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT

		assertEquals(0.6, pct,0);
	}

	@Test
	public void testLimiteSalarioPctValidoParaHomemEntreTrintaESeisEQuarentaECincoAnosComSalarioMenorASeisMil()
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		//Homem de 45 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido( "Masculino", "26/05/1966", BigDecimal.valueOf(3200));

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT

		assertEquals(0.55, pct,0);
	}

	@Test
	public void testLimiteSalarioPctValidoParaHomemEntreTrintaESeisEQuarentaECincoAnosComSalarioIgualASeisMil()
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		//Homem de 39 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido( "Masculino", "26/05/1972", BigDecimal.valueOf(6000));

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT

		assertEquals(0.55, pct,0);
	}

	@Test
	public void testLimiteSalarioPctValidoParaHomemEntreEQuarentaESeisESessentaECincoAnos()
			throws Exception{

		//ARRANGE

		EmprestimoBO emprestimo = EmprestimoBO.getInstance();

		//Homem de 46 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido( "Masculino", "30/10/1965", BigDecimal.valueOf(100));

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT

		assertEquals(0.30, pct,0);
	}

	@Test
	public void testLimiteSalarioPctValidoParaMulherEntreVinteUmETrintaAnosComIdadeMinima()
			throws Exception{

		//ARRANGE 

		EmprestimoBO emprestimo= EmprestimoBO.getInstance();

		//Mulheres com 21 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "20/10/1990", null);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.70, pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaMulherEntreVinteUmETrintaAnosComIdadeMaxima()
			throws Exception{

		//ARRANGE 

		EmprestimoBO emprestimo= EmprestimoBO.getInstance();

		//Mulheres com 30 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "20/10/1981", null);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.70, pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaMulherEntreTrintaEUmEQuarentaEQuatroAnosComIdadeMinima()
			throws Exception{

		//ARRANGE 

		EmprestimoBO emprestimo= EmprestimoBO.getInstance();

		//Mulheres com 31 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "20/10/1980", null);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.50, pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaMulherEntreTrintaEUmEQuarentaEQuatroAnosComIdadeMaxima()
			throws Exception{

		//ARRANGE 

		EmprestimoBO emprestimo= EmprestimoBO.getInstance();

		//Mulheres com 44 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "20/10/1967", null);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.50, pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaMulherEntreQuarentaECincoESessentaEUmAnosComIdadeMinima()
			throws Exception{

		//ARRANGE 

		EmprestimoBO emprestimo= EmprestimoBO.getInstance();

		//Mulheres com 45 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "01/02/1966", null);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.35, pct,0);

	}

	@Test
	public void testLimiteSalarioPctValidoParaMulherEntreQuarentaECincoESessentaEUmAnosComIdadeMaxima()
			throws Exception{

		//ARRANGE 

		EmprestimoBO emprestimo= EmprestimoBO.getInstance();

		//Mulheres com 61 anos
		String cpf = criaCenarioParaEmpregadoJaIncluido("Feminino", "20/10/1950", null);

		//ACT

		double pct = emprestimo.calculaPctLimiteEmprestimoSobreSalario(cpf);

		//ASSERT
		assertEquals(0.35, pct,0);

	}

}
